package com.eltsistemas.controller.afastamento;

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.SessionAttributes;

import com.eltsistemas.controller.grupo.GrupoComPermissao;
import com.eltsistemas.dao.AfastamentoDao;
import com.eltsistemas.dao.GenericDao;
import com.eltsistemas.hibernate.HibernateUtil;
import com.eltsistemas.modelo.Afastamento;
import com.eltsistemas.modelo.Funcionario;
import com.eltsistemas.modelo.Usuario;

@Controller
@SessionAttributes("usuario_Logado")
public class AfastamentoRemove {
	
	@RequestMapping(value="/afastamento/remove", method=RequestMethod.GET)
	public String remove(Afastamento afastamento, String nomeFuncionario, @ModelAttribute("usuario_Logado") Usuario user)
	{
		try
		{
			//Verifica se o grupo tem permissao
			List<String> moduloList = new GrupoComPermissao().getPermissao(user.getGrupo(), "Afastamento");
			for(String modulo : moduloList)
			{
				if(modulo.equals("remover"))
				{
					Session session = new HibernateUtil().getSession();
					session.beginTransaction();
						
					AfastamentoDao daoAfast = new AfastamentoDao(session);
				
					GenericDao<Funcionario> daoFuncionario = new GenericDao<>(session, Funcionario.class);
					
					Funcionario f = daoFuncionario.findByName(nomeFuncionario);
					
					//Se tenta excluir um afastamento que esteja ainda ativo, o sistema exibe mensgem para usuario
					if(daoAfast.verificaVigente(f.getId()) != null)
					{
						if(daoAfast.verificaVigente(f.getId()).equals(afastamento.getId()))
						{
							session.close();
							return "redirect:lista?valor=afastamento-periodo-ativo&nomeFuncionario="+nomeFuncionario;	
						}
					}
					
					GenericDao<Afastamento> daoAfastamento = new GenericDao<>(session, Afastamento.class);
					
					//Comita os dados no banco
					session = daoAfastamento.remover( afastamento );
					session.beginTransaction().commit();
					session.close();
					return "redirect:lista?nomeFuncionario="+nomeFuncionario;
				}
				
			}
			return "redirect:/painel/index";
		}
		catch(HibernateException e)
		{
			if(e.getClass().toString().contains("ConstraintViolationException"))
			{
				return "redirect:lista?valor=remove";
			}
			
			return "redirect:/painel/erro";
		}
	}
	
	
	
	@RequestMapping(value="/afastamento/delete", method=RequestMethod.GET)
	public String delete(String nomeFuncionario, @ModelAttribute("usuario_Logado") Usuario user)
	{
		try
		{
			//Verifica se o grupo tem permissao
			List<String> moduloList = new GrupoComPermissao().getPermissao(user.getGrupo(), "Afastamento");
			for(String modulo : moduloList)
			{
				if(modulo.equals("remover"))
				{
					Session session = new HibernateUtil().getSession();
					session.beginTransaction();
					
					GenericDao<Afastamento> daoAfastamento = new GenericDao<>(session, Afastamento.class);
					GenericDao<Funcionario> daoFuncionario = new GenericDao<>(session, Funcionario.class);
					
					Funcionario f = daoFuncionario.findByName(nomeFuncionario);
					f.setSituacao("Ativo");
					
					AfastamentoDao daoAfast = new AfastamentoDao(session);
					
					Long id_Afastamento = daoAfast.verificaVigente(f.getId());
					
					Afastamento afastamento = (Afastamento) session.load(Afastamento.class, id_Afastamento);
					
					afastamento.setVigente(false);
					
					//Comita os dados no banco
					session = daoFuncionario.altera( f );
					session = daoAfastamento.altera( afastamento );
					session.beginTransaction().commit();
					session.close();
					return "redirect:lista?nomeFuncionario="+nomeFuncionario;
				}
				
			}
			return "redirect:/painel/index";
		}
		catch(HibernateException e)
		{
			if(e.getClass().toString().contains("ConstraintViolationException"))
			{
				return "redirect:lista?valor=remove";
			}
			
			return "redirect:/painel/erro";
		}
	}
}
